﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Soat.SoPrism.TemplateWizards.Properties;

namespace Soat.SoPrism.TemplateWizards.Helpers
{
    /// <summary>
    /// Cette classe représente un Helper permettant de récupérer et d'affecter les parametres venant du VSTemplate et de la session Visual Studio
    /// </summary>
    internal class ParameterHelper
    {
        #region ParamDictionary Property
        
        /// <summary>
        /// Dictionnaire de parametres / Valeurs 
        /// </summary>
        public Dictionary<string, string> ParamDictionary { get; private set; } 

        #endregion

        #region Globals Property
        
        /// <summary>
        /// Variables Globals de Visual Studio
        /// </summary>
        public EnvDTE.Globals Globals { get; private set; } 

        #endregion

        #region Constructor

        /// <summary>
        /// Constructeur par défaut 
        /// </summary>
        /// <param name="automationObject">Environnement Visual Studio</param>
        public ParameterHelper(object automationObject)
        {
            this.Globals = ((EnvDTE._DTE)automationObject).Globals;
            //this.Globals = ((EnvDTE.DTEClass)(automationObject)).Globals;
            this.ParamDictionary = new Dictionary<string, string>();
        } 

        #endregion

        #region LoadParameters Method

        /// <summary>
        /// Cette méthode permet de charger l'ensemble des parametres issus du WizardData
        /// </summary>
        /// <param name="replacementsDictionary">Parametres du VSTemplate</param>
        public void LoadParameters(Dictionary<string, string> replacementsDictionary)
        {
            if (replacementsDictionary.ContainsKey("$wizarddata$"))
            {
                var parameters = replacementsDictionary["$wizarddata$"];
                var documentParameters = XDocument.Parse(parameters);
                if (documentParameters != null)
                {
                    foreach (var item in documentParameters.Root.Elements())
                    {
                        if (item.Name.ToString().Equals(Resources.VSTEMPLATE_NAMESPACE + "Parameter"))
                        {
                            this.ParamDictionary.Add(item.Attribute("Name").Value, item.Attribute("Value").Value);
                        }
                    }
                }
            }

        } 

        #endregion

        #region GetParameterValue Method

        /// <summary>
        /// Récupération de la valeur d'un parametre
        /// </summary>
        /// <param name="paramName">Nom du parametre</param>
        /// <returns>Valeur du parametre</returns>
        public string GetParameterValue(string paramName)
        {
            return this.GetParameterValue(paramName, true);
        }

        /// <summary>
        /// Récupération de la valeur d'un parametre
        /// </summary>
        /// <param name="paramName">Nom du parametre</param>
        /// <param name="inGlobal">Vérifie dans la session Visual Studio</param>
        /// <returns>Valeur du parametre</returns>
        public string GetParameterValue(string paramName, bool inGlobal)
        {
            string result = string.Empty;
            if (inGlobal && this.Globals.get_VariableExists(paramName) && !String.IsNullOrEmpty(Convert.ToString(this.Globals[paramName])))
            {
                result = Convert.ToString(this.Globals[paramName]);
            }
            else
            {
                if (this.ParamDictionary.ContainsKey(paramName))
                {
                    result = this.ParamDictionary[paramName];
                }
            }

            return result;
        } 

        #endregion

        #region SetParameterValue Method

        /// <summary>
        /// Enregistrement de la valeur d'un parametre dans la session Visual Studio
        /// </summary>
        /// <param name="paramName">Nom du parametre</param>
        /// <param name="paramValue">Valeur du parametre</param>
        public void SetParameterValue(string paramName, string paramValue)
        {
            // Enregistrement dans la Session Visual Studio
            if (this.Globals.get_VariableExists(paramName))
            {
                this.Globals[paramName] = paramValue;
            }
            else
            {
                this.Globals[paramName] = paramValue;
                this.Globals.set_VariablePersists(paramName, true);
            }
        } 

        #endregion
    }

}
